package com.hejing.String;

import org.junit.Test;

import java.io.UnsupportedEncodingException;

/**
 * ClassName: StringMethodTest
 * Package: com.hejing.String
 * Description:
 *
 * @Author: HeJing
 * @Create: 2023-04-16 18:35
 * @Version: 1.0
 */
public class StringMethodTest {

    /**
     * String构造器的使用:
     *
     */
    @Test
    public void test01(){

        String s1 = new String();
        String s2 = new String("");

        String s3 = new String(new char[]{'a', 'b', 'c'});
        System.out.println(s3);
    }

    /**
     * String与常见的其他结构之间的转换:
     *      1、String与基本数据类型、包装类之间的转换
     *
     *      2、String与char[]之间的转换:
     *          (1) String--> char[]
     *              -> 调用String类的toCharArray()方法
     *          (2) char[]--> String
     *              -> 调用String的构造器(String s = new String(char[] value) )
     *
     *      3、String 与 byte[] 之间的转换
     *
     */
    @Test
    public void test02(){
        int num = 10;

        // 基本数据类型 --> String : 调用String的valueOf()方法
        String s1 = num + "";
        String s2 = String.valueOf(num);

        // String --> 基本数据类型  调用包装类的 parseXXX()方法
        String s3 = "123";
        int i1 = Integer.parseInt(s3);
    }

    /**
     * String 与 char[] 之间的转换:
     *
     */
    @Test
    public void test03(){
        String str = "hello";
        // String --> char[]
        char[] arr = str.toCharArray();
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }

        // char[] --> String
        String str1 = new String(arr);
        System.out.println(str1);  // hello
    }

    //String 与 byte[] 之间的转换:
    /**
     * 在utf-8字符集中，一个汉字占用三个字节，一个字母占用一个字节；
     * 在gbk字符集中，一个汉字占用两个字节，一个字母占用一个字节
     * utf-8 或 gbk均向下兼容 ascii
     *
     * 编码与解码:
     *      编码: String --> 字节或者字节数组
     *      解码: 字节或字节数组 --> String
     *      要求: 解码时使用的字符集必须与编码时使用的字符集一致。
     */

    @Test
    public void test04() throws UnsupportedEncodingException {
        String str = new String("hello中国");
        // String --> byte[]: 调用String类的 getBytes()方法 (该方法使用默认字符集)
        byte[] bytes = str.getBytes();  // 该方法使用的是默认的字符集
        for (int i = 0; i < bytes.length; i++) {
            System.out.println(bytes[i]);
        }
        System.out.println("\n******************\n");
        // String --> byte[]: 调用String类的 getBytes(String charsetName)方法,(该方法使用指定字符集 charsetName)
        byte[] bytes1 = str.getBytes("gbk");  // 需要抛出异常: UnsupportedEncodingException
        for (int i = 0; i < bytes1.length; i++) {
            System.out.println(bytes1[i]);
        }

        // byte[] --> String: 调用String 的构造器
        String str1 = new String(bytes);

        // 注意，此处的bytes1已经指定了charset，将byte[]转化为相应的String时也必须手动指定与构造bytes1时指定的那个charset
        // 否则会出现乱码的情况。
        String str2 = new String(bytes1, "gbk");

        System.out.println(str1);
        System.out.println(str2);

    }
}




















